跳到主要内容

Linux 文件系统

Linux 的一切皆为文件

Linux 中的各种事物比如像文档、目录(Mac OS X 和 Windows 系统下称之为文件夹)、键盘、监视器、硬盘、可移动媒体设备、打印机、调制解调器、虚拟终端,还有进程间通信(IPC)和网络通信等输入/输出资源都是定义在文件系统空间下的字节流。

一切都可看作是文件,其最显著的好处是对于上面所列出的输入/输出资源,只需要相同的一套 Linux 工具、实用程序和 API。你可以使用同一套 api(read, write)和工具(cat , 重定向, 管道)来处理 unix 中大多数的资源。

Linux 以文件的形式对计算机中的数据和硬件资源进行管理,也就是彻底的一切皆文件,反映在 Linux 的文件类型上就是:普通文件、目录文件(也就是文件夹)、设备文件、链接文件、管道文件、套接字文件(数据通信的接口)等等,而这些种类繁多的文件被 Linux 使用目录树进行管理, 所谓的目录树就是以根目录(/)为主,向下呈现分支状的一种文件结构。

Linux 中的文件类型

目录文件

目录也是文件的一种,目录文件包含了各自目录下的文件名和指向这些文件的指针,打开目录事实上就是打开目录文件,只要有访问权限,你就可以随意访问这些目录下的文件(普通文件的执行权限就是目录文件的访问权限),但是只有内核的进程能够修改它们

虽然不能修改,但是我们能够通过 vim 去查看目录文件的内容

如下,访问 vim ~

软链接和硬链接

指向另一个文件的间接指针,也就是我们常说的软链接,如下:

【硬连接】 硬连接指通过索引节点来进行连接,在 Linux 的文件系统中,保存在磁盘分区中的文件不管是什么类型都给它分配一个编号,称为索引节点号(Inode Index)。在 Linux 中,多个文件名指向同一索引节点是存在的。一般这种连接就是硬连接。硬连接的作用是允许一个文件拥有多个有效路径名,这样用户就可以建立硬连接到重要文件,以防止 “误删” 的功能。其原因如上所述,因为对应该目录的索引节点有一个以上的连接。只删除一个连接并不影响索引节点本身和其它的连接,只有当最后一个连接被删除后,文件的数据块及目录的连接才会被释放。也就是说,文件真正删除的条件是与之相关的所有硬连接文件均被删除。

【软连接】 另外一种连接称之为符号连接(Symbolic Link),也叫软连接。软链接文件有点类似于 Windows 的快捷方式。它实际上是一个特殊的文件。在符号连接中,文件实际上是一个文本文件,其中包含的有另一文件的位置信息。

总结:硬链接是指针,所有的硬链接都是指向同一个磁盘块。 删除一个指针不会真正删除文件,只有把所有的指针都删除才会真正删除文件。 软连接是另外一种类型的文件,保存的是它指向文件的全路径, 访问时会替换成绝对路径

示例:

通过实验加深理解

$ touch f1          # 创建一个测试文件 f1
$ ln f1 f2 # 创建 f1 的一个硬连接文件 f2
$ ln -s f1 f3 # 创建 f1 的一个符号连接文件 f3
$ ls -li # -i 参数显示文件的 inode 节点信息
total 0
9797648 -rw-r--r-- 2 alsritter alsritter 0 Apr 21 08:11 f1
9797648 -rw-r--r-- 2 alsritter alsritter 0 Apr 21 08:11 f2
9797649 lrwxrwxrwx 1 alsritter alsritter 2 Apr 21 08:11 f3 -> f1
$

从上面的结果中可以看出,硬连接文件 f2 与原文件 f1 的 inode 节点相同,均为 9797648,然而符号连接文件的 inode 节点不同。

$ echo "I am f1 file" >>f1
$ cat f1
I am f1 file
$ cat f2
I am f1 file
$ cat f3
I am f1 file
$ rm -f f1
$ cat f2
I am f1 file
$ cat f3
cat: f3: No such file or directory
$

通过上面的测试可以看出:当删除原始文件 f1 后,硬连接 f2 不受影响,但是符号连接 f1 文件无效,可以得到以下全部结论:

  1. 删除符号连接 f3,对 f1,f2 无影响;
  2. 删除硬连接 f2,对 f1,f3 也无影响;
  3. 删除原文件 f1,对硬连接 f2 没有影响,导致符号连接 f3 失效;
  4. 同时删除原文件 f1,硬连接 f2,整个文件会真正的被删除。

块设备文件(b,block)和字符设备文件(c,char)

这些文件一般隐藏在 /dev 目录下,在进行设备读取和外设交互时会被使用到

比如磁盘光驱就是块设备文件,串口设备则属于字符设备文件 系统中的所有设备要么是块设备文件,要么是字符设备文件,无一例外

FIFO(p,pipe)

管道文件主要用于进程间通讯。比如使用 mkfifo 命令可以创建一个 FIFO 文件,启用一个进程 A 从 FIFO 文件里读数据,启动进程 B 往 FIFO 里写数据,先进先出,随写随读。

套接字(s,socket)

用于进程间的网络通信,也可以用于本机之间的非网络通信 这些文件一般隐藏在 /var/run 目录下,证明着相关进程的存在

文件系统是什么?

文件数据除了文件实际内容外, 通常含有非常多的属性,例如 Linux 操作系统的文件权限(rwx)与文件属性(拥有者、群组、时间参数等)。那这些数据是怎么组织的呢?这些数据的组织就是通过各种各样的文件系统。

Linux 把对不同文件系统的访问交给了 VFS(虚拟文件系统),VFS 能访问和管理各种不同的文件系统。所以有了硬盘区之后就需要把它格式化成具体的文件系统以便 VFS 访问。

通过 df -T 可以展示当前使用的文件系统

每个分区都可以有不同的的文件系统

文件系统(Ext2)通常会将这两部份的数据分别存放在不同的区块,权限与属性放置到 inode 中,至于实际数据则放置到 data block 区块中。另外,还有一个超级区块 (superblock) 会记录整个文件系统的整体信息,包括 inode 与 block 的总量、使用量、剩余量等。

  • superblock:记录此 filesystem 的整体信息,包括inode/block的总量、使用量、剩余量, 以及文件系统的格式与相关信息等;
  • inode:记录文件的属性,一个文件占用一个inode,同时记录此文件的数据所在的 block 号码;
  • block:实际记录文件的内容,若文件太大时,会占用多个 block 。

文件存储结构大概如下:

假设某一个文件的属性与权限数据是放置到 inode 4 号(下图较小方格内),而这个 inode 记录了文件数据的实际放置点为 2, 7, 13, 15 这四个 block 号码,此时我们的操作系统就能够据此来排列磁盘的读取顺序,可以一口气将四个 block 内容读出来,然后组成一个完整的文件

其中文件的 inode 结构如下(inode 里所包含的文件信息可以通过 stat filename 查看得到):

这里解释下它的意思:

Ext2 文件系统

inode 的内容在记录文件的权限与相关属性,至于 block 区块则是在记录文件的实际内容。 而且文件系统一开始就将 inode 与 block 规划好了,除非重新格式化(或者利用 resize2fs 等指令变更文件系统大小),否则 inode 与 block 固定后就不再变动。

但是将所有的 inode 与 block 通通放置在一起将是很不智的决定,因为 inode 与 block 的数量太庞大,不容易管理。因此 Ext2 文件系统在格式化的时候基本上是区分为多个区块群组 (block group) 的,每个区块群组都有独立的 inode/block/superblock 系统。每个块组实际还会分为分为 6 个部分,除了 inode table 和 data block 外还有4个附属模块,起到优化和完善系统性能的作用

整个来说,Ext2 格式化后有点像下面这样:

下面具体介绍这些具体的分区内容:

inode table

主要记录文件的属性以及该文件实际数据是放置在哪些 block 中

可以通过 debugfs 命令去检查文件的 inode,这个 debugfs 接受一个 stat 命令,后面跟着这个 inode 的 id

$ truncate -s 1M myfile
$ mkfs.ext2 -F myfile
$ debugfs -w myfile
debugfs: stat <2>
Inode: 2 Type: directory Mode: 0755 Flags: 0x0
Generation: 0 Version: 0x00000000
User: 0 Group: 0 Size: 1024
File ACL: 0 Directory ACL: 0
Links: 3 Blockcount: 2
Fragment: Address: 0 Number: 0 Size: 0
ctime: 0x5722081d -- Thu Apr 28 14:54:53 2016
atime: 0x5722081d -- Thu Apr 28 14:54:53 2016
mtime: 0x5722081d -- Thu Apr 28 14:54:53 2016
BLOCKS:
(0):24
TOTAL: 1

它记录的信息至少有这些:

References

Linux文件系统详解 5分钟让你明白“软链接”和“硬链接”的区别